package cn.itsource.ymcc.service.impl;

import cn.itsource.ymcc.domain.CourseType;
import cn.itsource.ymcc.mapper.CourseTypeMapper;
import cn.itsource.ymcc.service.ICourseTypeService;
import cn.itsource.ymcc.util.AssertUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.conditions.query.QueryChainWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * <p>
 * 课程目录 服务实现类
 * </p>
 *
 * @author whale.chen
 * @since 2023-02-27
 */
@Service
public class CourseTypeServiceImpl extends ServiceImpl<CourseTypeMapper, CourseType> implements ICourseTypeService {
    private static final String COURSE_TYPE_TREE_DATA = "course_type_tree_data";
    /**
     * 获得课程类型树
     * @return
     */
    @Override
    @Cacheable(cacheNames=COURSE_TYPE_TREE_DATA,key="'TREE'")
    public List<CourseType> getTreeData() {
        //使用redis缓存 (淘汰)
        return formap();
    }


    /**
     * 保存
     * @param entity
     * @return
     */
    @Override
    @Transactional
    @CacheEvict(cacheNames=COURSE_TYPE_TREE_DATA,key="'SAVE'")
    public boolean save(CourseType entity) {
        entity.setCreateTime(new Date());
        super.save(entity);
        String childrenPath = entity.getId().toString();
        CourseType courseType = baseMapper.selectById(entity.getPid());
        //如果是null说明是顶级
        if (courseType==null){
            entity.setPath(childrenPath);
            entity.setPid(0L);
            baseMapper.updateById(entity);
        }else {
            entity.setPath(courseType.getPath()+"."+childrenPath);
            baseMapper.updateById(entity);
        }
        return true;

    }

    /**
     * 根据id删除
     * @param id
     * @return
     */
    @Override
    @CacheEvict(cacheNames=COURSE_TYPE_TREE_DATA,key="'REMOVE'")
    public boolean removeById(Serializable id) {
        //校验该id下是否有子类
        List<CourseType> courseTypes= baseMapper.selectList(new QueryWrapper<CourseType>()
                .eq("pid", id));
        AssertUtil.isTrue(courseTypes==null || courseTypes.size()==0,"纯在子类不能删除");
        return super.removeById(id);
    }

    /**
     *修改
     * @param entity
     * @return
     */
    @Override
    @CacheEvict(cacheNames=COURSE_TYPE_TREE_DATA,key="'UPDATE'")
    public boolean updateById(CourseType entity) {
        entity.setUpdateTime(new Date());
        return super.updateById(entity);
    }

    /**
     * 使用list加hashmap进行查询
     * @return
     */
    public List<CourseType> formap(){
        ArrayList<CourseType> firstList = new ArrayList<>();
        //从数据库中查询出来的所有课程类型
        List<CourseType> courseTypes = baseMapper.selectList(null);
        //将课程类型放入到一个hashmap集合中 通过key取出值 效率更快
        Map<Long, CourseType> hashMap = courseTypes.stream()
                .collect(Collectors.toMap(courseType -> courseType.getId(), courseType -> courseType));
        CourseType parent = null;
        //校验是否是顶层 如果是就存入List
        for (CourseType courseType : courseTypes) {
            if (courseType.getPid()==0){
                firstList.add(courseType);
            }else {
                parent = hashMap.get(courseType.getPid());
                parent.getChildren().add(courseType);
            }
        }
        return firstList;
    }
}
